#include "monitor.h"

int main(int argc, char *argv[])
{

	key_t shmid = atoi(argv[1]);
	key_t shmidMon = atoi(argv[2]);
	//key_t shmidMon2 = atoi(argv[3]);
	//sem_t * semMemoria = (sem_t *)(argv[4]);
	//sem_t * semPartida = (sem_t *)(argv[5]);

	int tam,i;


    printf("MEMORIA A ELIMINAR!!!: %d   ", shmid);
    printf("MEMORIA A ELIMINAR!!!: %d", shmidMon);


	sem_name_M = (char*) malloc(sizeof(char) * 15);
	strcpy(sem_name_M, "/semMemoria");

	SEM_M = sem_open(sem_name_M, 0); /* Asocio el semáforo, asumo que lo creó el Servidor */
	if(SEM_M == SEM_FAILED) {
		cerr << "[Monitor] Error al abrir el Semáforo" << endl;
		exit(EXIT_FAILURE);
	}


	sem_name_M2 = (char*) malloc(sizeof(char) * 15);
	strcpy(sem_name_M2, "/semPartidas");

	SEM_M2 = sem_open(sem_name_M2, 0); /* Asocio el semáforo, asumo que lo creó el Servidor */
	if(SEM_M2 == SEM_FAILED) {
		cerr << "[Monitor] Error al abrir el Semáforo" << endl;
		exit(EXIT_FAILURE);
	}


 	//genero la llave para la memoria compartida
 	key_t clave;
 	clave = ftok("/bin/cp",222);
 	std::cout << "clave: " << clave << endl;
 	if(clave == 0){
 		std::cout << "No consigo clave para memoria compartida" << endl;
 		exit(EXIT_FAILURE);
 	}


      pid_t pidTorneo = getppid();
      crearMemoriaCompartida(clave);


     cout<<"[ Inicio Monitor ]"<<endl;

      // verifica si el proceso cliente esta vivo
     while(!kill(pidTorneo,0))
     {
         usleep(1000000*1);  // 1 seg
     }

 	//envío señal a los servidores de partida
 	for (i=0;i<torneo->cantPartidas;i++)
 	{
 	     //printf("pid.    %d ",torneo->partidas[i].pid);
 		if(torneo->partidas[i].pid > 0 && torneo->partidas[i].pid!=getpid())
 		{
 			printf("Enviando señal SIGUSR1 a los Servidores de Partida %d\n", torneo->partidas[i].pid);
 			kill(torneo->partidas[i].pid, SIGUSR1);
 		}
 	}
 	sleep(3);


 	//El cierre de sockets lo hace la partida. EL MENSAJE "mt" DE TODOS LOS JUGADORES LO HACE LA PARTIDA. ACA NO PUDE.
    char respuesta[TAMBUF];
    respuesta[TAMBUF] = '\0';
    memset(&respuesta,'\0',TAMBUF);
    strncpy(respuesta,"mt",TAMBUF);

 	sem_wait(SEM_M);
	for (i=0;i<torneo->cantJugadores;i++)
	{
		if(torneo->jugador[i].conectado !=0){
			send(torneo->jugador[i].socket , (char *)respuesta , TAMBUF , 0);
			send(torneo->jugador[i].socket , (char *)respuesta , TAMBUF , 0);
			close(torneo->jugador[i].socket);
			//printf("CERRADOS %d   ",torneo->jugador[i].socket);
		}
	}
	sem_post(SEM_M);


	//EMPIEZO A CERRAR TODO

 	 shmdt((t_torneo *)torneo);
     shmctl(shmid,IPC_RMID,(struct shmid_ds *)NULL);  // borrar el segmento compartido
     shmctl(shmidMon,IPC_RMID,(struct shmid_ds *)NULL);
     //shmctl(shmidMon2,IPC_RMID,(struct shmid_ds *)NULL);

 	 ////MAXI FALTA LIBERAR ESTO DEL TORNEO. LO PODES HACER?   HAR Q PASARLO AL EXECLP POR PARAMETRO.
	//SDL_FreeSurface(screen);
 	sem_close(SEM_M);/* desasocio el semaforo. */
 	sem_destroy(SEM_M);
 	sem_unlink(sem_name_M);/* destruyo el semaforo */
 	sem_close(SEM_M2);/* desasocio el semaforo. */
 	sem_destroy(SEM_M2);
 	sem_unlink(sem_name_M2);/* destruyo el semaforo */


 	//sem_close(semMemoria);/* desasocio el semaforo. */
 	//sem_unlink("/semMemoria");/* destruyo el semaforo */
 	//sem_unlink("/semPartidas");

     cout<<"El torneo ha finalizado"<<endl;

     return 0;

}

void crearMemoriaCompartida(key_t clave){

	//genero memoria compartida.
	id_memo = shmget(clave,sizeof(t_torneo),IPC_CREAT | 0666);
	//printf ("id_memo Torneo %d\n", id_memo);
	if(id_memo < 0) {
			std::cout << "No consigo clave para memoria compartida" << endl;
			exit(EXIT_FAILURE);
		}

	torneo = (t_torneo *) shmat(id_memo,NULL,0);
}
